package top.byfree.jbyan.find.command;

import top.byfree.jbyan.find.exception.ParseArgException;

import java.util.*;

/**
 * @author jbyan
 * @since 2023/8/3
 */
public class CommandLineArgs {

    private final Map<Arg, List<String>> argsMap = new HashMap<>();
    private final List<String> posArgs = new ArrayList<>();

    public void parse(String[] args) throws ParseArgException {
        for (int i = 0; i < args.length; i++) {
            if (args[i].startsWith("-")) {
                // 参数名
                String name = args[i].substring(1);
                Arg arg = Arg.findArg(name);
                // 出现不理解的参数，向外抛出异常
                if (Objects.isNull(arg)) {
                    String format = String.format("非法参数: ‘%s’, 请参考: --help。", name);
                    throw new ParseArgException(format);
                }
                // size 表示当前参数需要跟多少个参数
                int size = arg.getSize();
                List<String> values = null;
                if (size > 0) {
                    values = new ArrayList<>();
                    for (int j = 0; j < size; j++) {
                        // 不存在下一个参数了
                        if (i + 1 > args.length - 1) {
                           break;
                        }
                        // 获取下一个参数
                        String nextArg = args[i + 1];
                        // 下一个参数不以-开头
                        if (!nextArg.startsWith("-")) {
                            i++;
                            values.add(nextArg);
                            break;
                        }
                    }

                }
                argsMap.put(arg, values);
            } else {
                posArgs.add(args[i]);
            }
        }
        if (posArgs.size() < 1 && !argsMap.containsKey(Arg.HELP)) {
            throw new ParseArgException("非法参数： 至少需要一个关键字参数， 请参考： --help。");
        }
    }

    public List<String> getArgsList(Arg arg) {
        return argsMap.get(arg);
    }

    public String getStringArg(Arg arg) {
        List<String> strings = argsMap.get(arg);
        if (Objects.isNull(strings) || strings.isEmpty()) {
            return (String) arg.getDefaultVal();
        }
        return strings.get(0);
    }

    public int getIntArg(Arg arg) throws ParseArgException {
        List<String> strings = argsMap.get(arg);
        if (Objects.isNull(strings) || strings.isEmpty()) {
            return (int) arg.getDefaultVal();
        }
        try {
            return Integer.parseInt(strings.get(0));
        } catch (NumberFormatException e) {
            String s = String.format("非法参数：%s， %s，请参考 --help。", arg.getName(), strings.get(0));
            throw new ParseArgException(s);
        }
    }

    public boolean isArg(Arg arg){
        return argsMap.containsKey(arg);
    }


    public List<String> getPosArgs() {
        return posArgs;
    }
}
